home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / gfx / misc / gnuplot-3.7src.lha / gnuplot-3.7src / gnuplot-3.7.lha / gnuplot-3.7 / term / dumb.trm < prev    next >
Text File  |  1998-12-14  |  9KB  |  387 lines

  1. /*
  2.  * $Id: dumb.trm,v 1.24 1998/04/14 00:17:37 drd Exp $
  3.  *
  4.  */
  5.  
  6. /* GNUPLOT - dumb.trm */
  7.  
  8. /*[
  9.  * Copyright 1991 - 1993, 1998   Thomas Williams, Colin Kelley
  10.  *
  11.  * Permission to use, copy, and distribute this software and its
  12.  * documentation for any purpose with or without fee is hereby granted,
  13.  * provided that the above copyright notice appear in all copies and
  14.  * that both that copyright notice and this permission notice appear
  15.  * in supporting documentation.
  16.  *
  17.  * Permission to modify the software is granted, but not the right to
  18.  * distribute the complete modified source code.  Modifications are to
  19.  * be distributed as patches to the released version.  Permission to
  20.  * distribute binaries produced by compiling modified sources is granted,
  21.  * provided you
  22.  *   1. distribute the corresponding source modifications from the
  23.  *    released version in the form of a patch file along with the binaries,
  24.  *   2. add special version identification to distinguish your version
  25.  *    in addition to the base release version number,
  26.  *   3. provide your name and address as the primary contact for the
  27.  *    support of your modified version, and
  28.  *   4. retain our contact information in regard to use of the base
  29.  *    software.
  30.  * Permission to distribute the released version of the source code along
  31.  * with corresponding source modifications in the form of a patch file is
  32.  * granted with same provisions 2 through 4 for binary distributions.
  33.  *
  34.  * This software is provided "as is" without express or implied warranty
  35.  * to the extent permitted by applicable law.
  36. ]*/
  37.  
  38. /*
  39.  * This file is included by ../term.c.
  40.  *
  41.  * This terminal driver supports:
  42.  *   DUMB terminals
  43.  *
  44.  * AUTHORS
  45.  *   Francois Pinard, 91-04-03
  46.  *           INTERNET: pinard@iro.umontreal.ca
  47.  *
  48.  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
  49.  *
  50.  */
  51. #include "driver.h"
  52.  
  53. #ifdef TERM_REGISTER
  54. register_term(dumb_driver)
  55. #endif
  56.  
  57. #ifdef TERM_PROTO
  58. TERM_PUBLIC void DUMB_options __PROTO((void));
  59. TERM_PUBLIC void DUMB_init __PROTO((void));
  60. TERM_PUBLIC void DUMB_graphics __PROTO((void));
  61. TERM_PUBLIC void DUMB_text __PROTO((void));
  62. TERM_PUBLIC void DUMB_reset __PROTO((void));
  63. TERM_PUBLIC void DUMB_linetype __PROTO((int linetype));
  64. TERM_PUBLIC void DUMB_move __PROTO((unsigned int x, unsigned int y));
  65. TERM_PUBLIC void DUMB_point __PROTO((unsigned int x, unsigned int y,
  66.                      int point));
  67. TERM_PUBLIC void DUMB_vector __PROTO((unsigned int x, unsigned int y));
  68. TERM_PUBLIC void DUMB_put_text __PROTO((unsigned int x, unsigned int y,
  69.                     char *str));
  70. TERM_PUBLIC void DUMB_arrow __PROTO((unsigned int sx, unsigned int sy,
  71.                      unsigned int ex, unsigned int ey,
  72.                      int head));
  73.  
  74. #define DUMB_XMAX 79
  75. #define DUMB_YMAX 24
  76.  
  77. #endif /* TERM_PROTO */
  78.  
  79. #ifdef TERM_BODY
  80.  
  81. #define DUMB_AXIS_CONST '\1'
  82. #define DUMB_BORDER_CONST '\2'
  83.  
  84. /* matrix of characters */
  85. static char *dumb_matrix = NULL;
  86. /* matrix of priority at each position */
  87. static char *dumb_priority = NULL;
  88. /* current character used to draw */
  89. static char dumb_pen;
  90. /* current X position */
  91. static int dumb_x;
  92. /* current Y position */
  93. static int dumb_y;
  94. static int dumb_xmax = DUMB_XMAX;
  95. static int dumb_ymax = DUMB_YMAX;
  96. static int dumb_feed = 1;
  97.  
  98. #define DUMB_PIXEL(x,y) dumb_matrix[dumb_xmax*(y)+(x)]
  99.  
  100. static void dumb_set_pixel __PROTO((int x, int y, int v, int p));
  101.  
  102.  
  103. static void dumb_set_pixel(x, y, v, p)
  104. int x, y, v, p;
  105. {
  106.     if ((unsigned) x <= dumb_xmax &&    /* ie x>=0 && x<=dumb_xmax */
  107.     (unsigned) y <= dumb_ymax &&
  108.     p > dumb_priority[dumb_xmax * y + x]) {
  109.     dumb_matrix[dumb_xmax * y + x] = v;
  110.     dumb_priority[dumb_xmax * y + x] = p;
  111.     }
  112. }
  113.  
  114.  
  115. TERM_PUBLIC void DUMB_options()
  116. {
  117.     int x, y;
  118.     struct value a;
  119.  
  120.     if (almost_equals(c_token, "f$eed"))
  121.     ++c_token, dumb_feed = 1;
  122.     else if (almost_equals(c_token, "nof$eed"))
  123.     ++c_token, dumb_feed = 0;
  124.  
  125.     if (!END_OF_COMMAND) {
  126.     x = (int) real(const_express(&a));
  127.     if (!END_OF_COMMAND) {
  128.         y = (int) real(const_express(&a));
  129.         dumb_xmax = term->xmax = x;
  130.         dumb_ymax = term->ymax = y;
  131.     }
  132.     }
  133.     sprintf(term_options, "%sfeed %d %d",
  134.         dumb_feed ? "" : "no", dumb_xmax, dumb_ymax);
  135. }
  136.  
  137.  
  138. TERM_PUBLIC void DUMB_init()
  139. {
  140.     if (dumb_matrix)
  141.     free(dumb_matrix);
  142.  
  143.     dumb_matrix = gp_alloc((unsigned long) dumb_xmax * dumb_ymax * 2, "dumb terminal");
  144.  
  145.     dumb_priority = dumb_matrix + dumb_xmax * dumb_ymax;
  146. }
  147.  
  148.  
  149. TERM_PUBLIC void DUMB_graphics()
  150. {
  151.     int i;
  152.     char *pm = dumb_matrix, *pp = dumb_priority;
  153.  
  154.     for (i = dumb_xmax * dumb_ymax; i > 0; i--) {
  155.     *pm++ = ' ';
  156.     *pp++ = 0;
  157.     }
  158. }
  159.  
  160.  
  161. TERM_PUBLIC void DUMB_text()
  162. {
  163.     int x, y, l;
  164.  
  165.     putc('\f', gpoutfile);
  166.     for (y = dumb_ymax - 1; y >= 0; y--) {
  167.     for (l = dumb_xmax; l > 0 && DUMB_PIXEL(l - 1, y) == ' '; l--);
  168.     for (x = 0; x < l; x++)
  169.         putc(DUMB_PIXEL(x, y), gpoutfile);
  170.     if (dumb_feed || y > 0)
  171.         putc('\n', gpoutfile);
  172.     }
  173.     fflush(gpoutfile);
  174. }
  175.  
  176.  
  177. TERM_PUBLIC void DUMB_reset()
  178. {
  179.     free(dumb_matrix);
  180.     dumb_matrix = NULL;
  181. }
  182.  
  183.  
  184. TERM_PUBLIC void DUMB_linetype(linetype)
  185. int linetype;
  186. {
  187.     static char pen_type[7] = { '*', '#', '$', '%', '@', '&', '=' };
  188.  
  189.     if (linetype == -2)
  190.     dumb_pen = DUMB_BORDER_CONST;
  191.     else if (linetype == -1)
  192.     dumb_pen = DUMB_AXIS_CONST;
  193.     else {
  194.     linetype = linetype % 7;
  195.     dumb_pen = pen_type[linetype];
  196.     }
  197. }
  198.  
  199.  
  200. TERM_PUBLIC void DUMB_move(x, y)
  201. unsigned int x, y;
  202. {
  203.     dumb_x = x;
  204.     dumb_y = y;
  205. }
  206.  
  207.  
  208. TERM_PUBLIC void DUMB_point(x, y, point)
  209. unsigned int x, y;
  210. int point;
  211. {
  212.     dumb_set_pixel(x, y, point == -1 ? '.' : point % 26 + 'A', 4);
  213. }
  214.  
  215.  
  216. TERM_PUBLIC void DUMB_vector(_x, _y)
  217. unsigned int _x, _y;
  218. {
  219.     int x = _x;            /* we need signed int, since
  220.                  * unsigned-signed=unsigned and */
  221.     int y = _y;            /* abs and cast to double wouldn't work */
  222.     char pen, pen1;
  223.     int priority;
  224.     int delta;
  225.  
  226.     if (ABS(y - dumb_y) > ABS(x - dumb_x)) {
  227.     switch (dumb_pen) {
  228.     case DUMB_AXIS_CONST:
  229.         pen = ':';
  230.         pen1 = '+';
  231.         priority = 1;
  232.         break;
  233.  
  234.     case DUMB_BORDER_CONST:
  235.         pen = '|';
  236.         pen1 = '+';
  237.         priority = 2;
  238.         break;
  239.  
  240.     default:
  241.         pen = dumb_pen;
  242.         pen1 = dumb_pen;
  243.         priority = 3;
  244.         break;
  245.     }
  246.     dumb_set_pixel(dumb_x, dumb_y, pen1, priority);
  247.     for (delta = 1; delta < ABS(y - dumb_y); delta++) {
  248.         dumb_set_pixel(dumb_x  + (int) ((double) (x - dumb_x) *
  249.                         delta / ABS(y - dumb_y) + 0.5),
  250.                dumb_y + delta * sign(y - dumb_y), pen, priority);
  251.     }
  252.     dumb_set_pixel(x, y, pen1, priority);
  253.     } else if (ABS(x - dumb_x) > ABS(y - dumb_y)) {
  254.     switch (dumb_pen) {
  255.     case DUMB_AXIS_CONST:
  256.         pen = '.';
  257.         pen1 = '+';
  258.         priority = 1;
  259.         break;
  260.  
  261.     case DUMB_BORDER_CONST:
  262.         pen = '-';
  263.         pen1 = '+';
  264.         priority = 2;
  265.         break;
  266.  
  267.     default:
  268.         pen = dumb_pen;
  269.         pen1 = dumb_pen;
  270.         priority = 3;
  271.         break;
  272.     }
  273.     dumb_set_pixel(dumb_x, dumb_y, pen1, priority);
  274.     for (delta = 1; delta < ABS(x - dumb_x); delta++)
  275.         dumb_set_pixel(dumb_x + delta * sign(x - dumb_x),
  276.                dumb_y +
  277.                (int) ((double) (y - dumb_y) * delta / ABS(x - dumb_x)
  278.                   + 0.5),
  279.                pen, priority);
  280.     dumb_set_pixel(x, y, pen1, priority);
  281.     } else {
  282.     switch (dumb_pen) {
  283.     case DUMB_AXIS_CONST:    /* zero length axis */
  284.         pen = '+';
  285.         priority = 1;
  286.         break;
  287.  
  288.     case DUMB_BORDER_CONST:    /* zero length border */
  289.         pen = '+';
  290.         priority = 2;
  291.         break;
  292.  
  293.     default:
  294.         pen = dumb_pen;
  295.         priority = 3;
  296.         break;
  297.     }
  298.     for (delta = 0; delta <= ABS(x - dumb_x); delta++)
  299.         dumb_set_pixel(dumb_x + delta * sign(x - dumb_x),
  300.                dumb_y + delta * sign(y - dumb_y),
  301.                pen, priority);
  302.     }
  303.     dumb_x = x;
  304.     dumb_y = y;
  305. }
  306.  
  307.  
  308. TERM_PUBLIC void DUMB_put_text(x, y, str)
  309. unsigned int x, y;
  310. char *str;
  311. {
  312.     int length;
  313.  
  314.     length = strlen(str);
  315.     if (x + length > dumb_xmax)
  316.     x = GPMAX(0, dumb_xmax - length);
  317.  
  318.     for (; x < dumb_xmax && *str; x++, str++)
  319.     dumb_set_pixel(x, y, *str, 5);
  320. }
  321.  
  322.  
  323. TERM_PUBLIC void DUMB_arrow(sx, sy, ex, ey, head)
  324. unsigned int sx, sy, ex, ey;
  325. int head;            /* ignored */
  326. {
  327.     char saved_pen;
  328.     char saved_x;
  329.     char saved_y;
  330.  
  331.     saved_pen = dumb_pen;
  332.     saved_x = dumb_x;
  333.     saved_y = dumb_y;
  334.  
  335.     dumb_pen = '>';
  336.     dumb_x = sx;
  337.     dumb_y = sy;
  338.     DUMB_vector(ex, ey);
  339.  
  340.     dumb_pen = saved_pen;
  341.     dumb_x = saved_x;
  342.     dumb_y = saved_y;
  343. }
  344.  
  345. #endif /* TERM_BODY */
  346.  
  347. #ifdef TERM_TABLE
  348. TERM_TABLE_START(dumb_driver)
  349.     "dumb", "printer or glass dumb terminal",
  350.     DUMB_XMAX, DUMB_YMAX, 1, 1,
  351.     1, 1, DUMB_options, DUMB_init, DUMB_reset,
  352.     DUMB_text, null_scale, DUMB_graphics, DUMB_move, DUMB_vector,
  353.     DUMB_linetype, DUMB_put_text, null_text_angle,
  354.     null_justify_text, DUMB_point, DUMB_arrow, set_font_null,
  355.     0,                /* pointsize */
  356.     TERM_CAN_MULTIPLOT
  357. TERM_TABLE_END(dumb_driver)
  358.  
  359. #undef LAST_TERM
  360. #define LAST_TERM dumb_driver
  361.  
  362. #endif /* TERM_TABLE */
  363.  
  364. #ifdef TERM_HELP
  365. START_HELP(dumb)
  366. "1 dumb",
  367. "?commands set terminal dumb",
  368. "?set terminal dumb",
  369. "?set term dumb",
  370. "?terminal dumb",
  371. "?term dumb",
  372. "?dumb",
  373. " The `dumb` terminal driver has an optional size specification and trailing",
  374. " linefeed control.",
  375. "",
  376. " Syntax:",
  377. "       set terminal dumb {[no]feed} {<xsize> <ysize>}",
  378. "",
  379. " where <xsize> and <ysize> set the size of the dumb terminals. Default is",
  380. " 79 by 24. The last newline is printed only if `feed` is enabled.",
  381. "",
  382. " Examples:",
  383. "       set term dumb nofeed",
  384. "       set term dumb 79 49 # VGA screen---why would anyone do that?"
  385. END_HELP(dumb)
  386. #endif /* TERM_HELP */
  387.